import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Test {
    //给定一个有序整型数组, 实现二分查找




    //奇数位于偶数之前:调整数组顺序使得奇数位于偶数之前。调整之后，不关心大小顺序。
    //如数组：[1,2,3,4,5,6]  调整后可能是：[1, 5, 3, 4, 2, 6]
    public static void main31(String[] args) {
        int []array={2,1,2,3,4,5,6};
        //change(array);                       //错误的 有 BUG，当数组为{2,1,2,3,4,5,6}时就无法完成调序
        change2(array);
        System.out.println(Arrays.toString(array));
    }

    public static void change2(int[]array){
        int left=0,right=array.length-1;
        while(left<right){
            //left找到偶数就停止
            while((left<right) && (array[left]%2!=0)){        //注意left<right容易遗漏
                left++;
            }
            //right找到奇数就停止
            while((left<right) && (array[right]%2==0)){     //注意left<right容易遗漏
                right--;
            }
            //对偶数和奇数进行交换
            int tem=array[left];
            array[left]=array[right];
            array[right]=tem;
        }
    }

    public static void change(int[]arr){
        int left=0,right=arr.length-1;
        for (int i = 0; i < arr.length; i++) {
            if(arr[left]>=arr[right]){                //先保证left<right才能进行下面的判断以及交换
                break;
            }
            if((arr[left]%2==0) && (arr[right]%2!=0)){  // BUG 当left和right同时为偶数时会被忽略
                int tem=arr[left];
                arr[left]=arr[right];
                arr[right]=tem;
            }
            left++;
            right--;
        }
    }





    //实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 ,
    // 并设置到对应的数组元素上. 例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}
    public static void main30(String[] args) {
        int []array={1,2,3};
        transform(array);
        System.out.println(Arrays.toString(array));
    }
    public static int [] transform(int []array){
        for (int i = 0; i < array.length; i++) {
            array[i]*=2;
        }
        return array;
    }



    //求最大值方法的重载：在同一个类中定义多个方法：要求不仅可以求2个整数的最大值，还可以求3个小数的最大值？
    public static void main29(String[] args) {
        int a=3,b=8;
        double x=3.5,y=5,z=8.4;
        System.out.println("俩整数最大值："+max(a,b));
        System.out.println("三小数最大值："+max(x,y,z));
    }
    public static int max(int m,int n){
       return m>n?m:n;
    }
    public static double max(double h,double r,double d){
        double t=h>r?h:r;
        return t>d?t:d;
    }





    //在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码，求出结果
    public static void main28(String[] args) {
        int e=3,f=5;
        double j=2.2,k=3.6,l=4.8;
        System.out.println("俩整数之和："+sum(e,f));
        System.out.println("三小数之和："+sum(j,k,l));
    }
    public static int sum(int x,int y){
        return x+y;
    }
    public static double sum(double a,double b,double c){
        return a+b+c;
    }




    //创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    //要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算
    public static void main27(String[] args) {
        int a=11,b=9,c=12;
        int t_max=two_max(a,b);
        System.out.println(t_max);
        int s_max=three_max(a,b,c);
        System.out.println(s_max);
    }
    public static int two_max(int x, int y){
        int mx=0;
        if(x>y){
            return x;
        }else{
            return y;
        }
    }
    public static int three_max(int x,int y,int z){
        int k=two_max(x,y);
        return  k>z?k:z;
    }








    //输出n*n的乘法口诀表，n由用户输入
    public static void main26(String[] args) {
        Scanner scan=new Scanner(System.in);
        System.out.println("请输入乘法口诀表行数：");
        int n=scan.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(i+"*"+j+"="+i*j+" ");
            }
            System.out.println();
        }
    }




    //编写代码模拟三次密码输入的场景。 最多能输入三次密码，密码正确，提示“登录成功”,
    // 密码错误， 可以重新输 入，最多输入三次。三次均错，则提示退出程序
    public static void main25(String[] args) {
        int n=123,count=0,m=0;
        Scanner scan=new Scanner(System.in);
        while(count<4){
            System.out.println("请输入密码：");
             m=scan.nextInt();
            if(m==n){
                System.out.println("登陆成功");
                break;
            }else{
                System.out.println("密码错误");
                count++;
                if(count==3){
                    System.out.println("退出程序");
                    break;
                }
            }
        }
    }



    //输出一个整数的每一位，如：123的每一位是3，2，1
    public static void main24(String[] args) {
        int a=123;
        while(a>0){
            System.out.println(a%10);
            a=a/10;
        }
    }



    //计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。
    public static void main23(String[] args) {
        double sum=0,ret=1.0,n=1.0;
        for (int i = 1; i <= 100; i++) {
            n=(double)(1)/i*ret;
            sum+=n;
            ret=ret*-1;
        }
        System.out.println(sum);
    }









    // 输出X图案
    public static void main22(String[] args) {
        Scanner scan=new Scanner(System.in);
        while(scan.hasNext()){
            int n=scan.nextInt();
            for (int i = 0; i < n; i++) {         //i控制行数
                for (int j = 0; j < n; j++) {     //j控制列数
                    if ((i == j) ) {
                        System.out.print("*");
                    }else if(j == n - 1 - i){
                        System.out.print("*");
                    }else {
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }

    }




    //输出 1000 - 2000 之间所有的闰年
    public static void main21(String[] args) {
        for (int i = 1000; i <= 2000; i++) {
            if((i%4==0&&i%100!=0)||i%400==0){  //能被4整除的同时不能被100整除 或者 能被400整除
                System.out.println(i);
            }
        }
    }





    //编写程序数一下 1到 100 的所有整数中出现多少个数字9
    public static void main20(String[] args) {
        int i=0,count=0;
        for ( i = 1; i <=100 ; i++) {
            if(i%10==9){          //个位数为9
                count++;
            }
            if(i/10==9){          //十位数为9
                count++;
            }
        }
        System.out.println(count);
    }








    //打印 1 - 100 之间所有的素数
    public static void main19(String[] args) {
        int a=0,i=0;
        for ( a = 1; a<100 ; a++) {
            for ( i = 2; i < a; i++) {
                if(a%i==0){
                    System.out.println(a+"不是素数");
                    break;
                }
            }
            if(i==a){
                System.out.println(a+"是素数");
            }
        }
    }


    //判定素数
    public static void main18(String[] args) {
        int a = 2;
        int i = 0;
        for (i = 2; i < a; i++) {             //循环2-a之间的所有数
            if (a % i == 0) {                 //若有数能够被整除
                System.out.println(a+"不是素数"); //则不是素数
                break;                        //就结束循环不再继续
            }
        }
        if (i == a) {                          //如果所有数循环结束，没有被整除的数
            System.out.println(a+"是素数");       //则是素数
        }
    }
    /*
    求一个整数，在内存当中存储时，二进制1的个数。
     */
    public static void main1(String[] args) {
        int n = -1;
        int count = 0;
        for (int i = 0; i < 32; i++) {
            if ((n >> i & 1) != 0) {
                count++;
            }
        }
        System.out.println(count);
    }

    /*
    计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。
     */
    public static void main2(String[] args) {
        int flag = 1;
        double sum = 0;
        double ret = 0;
        for (int i = 1; i <= 100; i++) {
            ret = (1.0 / i) * flag;           //每一项
            sum = sum + ret;                //项之和
            flag = -flag;
        }
        System.out.println(sum);
    }

    /*
    求出0～n之间的所有“水仙花数”并输出。
    (“水仙花数”是指一个三位数，其各位数字的立方和确好等于该数本 身，如；153＝1^3＋5^3＋3^3，则153是一个“水仙花数“。）
     */
    public static void main3(String[] args) {
        int a = 0, b = 0, c = 0;
        for (int i = 100; i <= 999; i++) {
            a = i % 10;
            b = i / 10 % 10;
            c = i / 100;
            if (((a * a * a) + (b * b * b) + (c * c * c)) == i)
                System.out.println(i);
        }
    }

    /*
    求出0～n之间的所有“次幂数”并输出。
     */
    public static void main4(String[] args) {


        for (int i = 1; i < 999999999; i++) {
            int count = 0;
            int ret = i;
            int sum = 0;
            while (ret != 0) {
                ret = ret / 10;
                count++;                   //count表示几位数
            }
            ret = i;
            while (ret != 0) {
                sum += Math.pow(ret % 10, count);  //sum表示各位数字次幂之和
                ret = ret / 10;
            }
            if (sum == i) {
                System.out.println(i);
            }
        }
    }

    /*
    输出一个整数的每一位，如：123的每一位是3，2，1
     */
    public static void main5(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        while (n != 0) {
            System.out.println(n % 10);
            n /= 10;
        }
    }

    /*
    给定一个数字，判定一个数字是否是素数
     */
    //错误示例
    public static void main6(String[] args) {
        int n = 9;
        for (int i = 2; i < 9; i++) {
            if (n % 2 == 0)
                System.out.println(n + "不是素数");
            else
                System.out.println(n + "是素数");
        }
    }

    //正确示例1
    public static void main7(String[] args) {
        int n = 9;
        int i = 0;
        for (i = 2; i < 9; i++) {
            if (n % i == 0) {
                System.out.println(n + "不是素数");
                break;
            }
        }
        if (n == i) {                         //注意是将2-9之间所有的数都依次循环结束后没有一个数能被整除才是素数
            System.out.println(n + "是素数");
        }
    }

    //正确示例2
    public static void main8(String[] args) {
        int i = 0;
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        for (i = 2; i < n / 2; i++) {
            //n如果是素数的话 一定能写成a*b的形式，a和b中必然有一个数在2-n/2之间
            // 也就是说2-n/2之间若有一个数能够被n整除的话就一定不是素数
            //例如：16 1x16(1在2-8之间)  2x8(2za)  4x4(4在2-8之间) 例如: 17  1x17
            if (n % i == 0) {
                System.out.println(n + "不是素数");
                break;
            }
        }
        if (i >= n / 2)
            //如果2-n/2之间所有的数字全部循环完毕，没有数字能够被n整除的话 就证明n为素数
            //注意这个条件一定是放在循环外面的，易错点：很容易将这个条件放在循环里面
            System.out.println(n + "是素数");
    }

    //正确示例3
    public static void main9(String[] args) {
        int i = 0;
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        for (i = 2; i <= Math.sqrt(n); i++) {
            //如果n是素数 一定能写成a*b的形式，那么a和b之间必有一个数在2-根号下n 之间
            //也就是说在2-根号下n之间若有一个数能够被n整除的话就一定不是素数
            //例如：16 1x16(1在2-4之间)  2x8(2在2-4之间)  4x4(4在2-4之间)  例如: 17  1x17
            if (n % i == 0) {
                System.out.println(n + "不是素数");
                break;
            }
        }
        if (i >= Math.sqrt(n)) {
            //如果2-根号下n之间的所有数字全部循环完毕，没有数字能够被n整除的话 就证明n是素数 17  1x17
            //注意此判断条件一定是放在循环外面的，很容易错放在循环里面与循环里面的条件else
            System.out.println(n + "是素数");
        }
    }

    /*
    打印 1 - 100 之间所有的素数
     */
    public static void main10(String[] args) {
        for (int i = 1; i <= 100; i++) {
            int j = 0;
            for (j = 2; j < i; j++) {
                if (i % j == 0) {
                    break;
                }
            }
            if (j == i) {                         //注意是将2-i之间所有的数都依次循环结束后没有一个数能被整除才是素数
                System.out.println(i + "是素数");
            }
        }
    }

    /*
    编写程序数一下 1到 100 的所有整数中出现多少个数字9
     */
    //错误示例 只考虑了个位数上的9 忽略了十位数上的9  还有特殊的 99
    public static void main11(String[] args) {
        int count = 0;
        for (int i = 0; i < 100; i++) {
            if (i % 10 == 9) {
                //System.out.println(i);
                count++;
            }
            if (i / 10 == 9) {
                //System.out.println(i);
                count++;
            }
        }
        System.out.println(count);
    }

    /*
    输出X型图案
     */
    public static void main12(String[] args) {
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt())
        {
            int n = scan.nextInt();
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if ((i == j) || (i + j == n - 1)) {
                        System.out.print("*");
                    } else
                        System.out.print(" ");
                }
                System.out.println(" ");
            }

        }

    }


    /*
    输出乘法口诀表
     */
    public static void main13(String[] args) {
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()){
            int n=scan.nextInt();
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= i; j++) {
                    System.out.print(j + "*" + i + "=" + j * i);
                    System.out.print(" ");
                }
                System.out.println( );
            }
        }

    }

    /*
    输出一个整数的每一位，如：123的每一位是3，2，1
     */
    public static void main14(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();
        while(n!=0)
        {
            System.out.println(n%10);
            n=n/10;
        }
        }
    /*
    编写代码模拟三次密码输入的场景。 最多能输入三次密码，密码正确，提示“登录成功”,
    密码错误， 可以重新输入，最多输入三次。三次均错，则提示退出程序
     */
    public static void main15(String[] args) {
        int count = 3;
        Random random = new Random();
        int magic = random.nextInt(100);  //产生[0-100)内的随机数
        Scanner scan = new Scanner(System.in);
        while (count!=0) {
            System.out.println("Welcome!");
            System.out.println("请输入你的密码，共有"+count+"次机会");
            int guess = scan.nextInt();
            if (guess == magic) {
                System.out.println("登陆成功!");
                break;
            } else if (guess > magic) {
                System.out.println("猜大了 请重新输入");
                count--;
                System.out.println("你还有"+count+"次机会");
                continue;
            } else if (guess < magic) {
                System.out.println("猜小了 请重新输入");
                count--;
                System.out.println("你还有"+count+"次机会");
                continue;
            }
            }
            System.out.println("已连续输入错误3次 退出程序");
    }

    public static void main16(String[] args) {
        int count=3;
        Scanner scan=new Scanner(System.in);
        System.out.println("请输入你的密码！共有"+count+"次机会");
      while(count!=0){
          String pass= scan.nextLine();
          if(pass.equals("999")){            //java中比较字符串用 .equals
              System.out.println("登陆成功！");
              break;
          }else{
              count--;
              System.out.println("登陆失败！你还有"+count+"次机会");
          }
      }
    }

    public static void main17(String[] args) {
        int n=7;
        for (int i = 31; i >= 1 ; i-=2) {
            System.out.print(((n>>i)&1)+" ");
        }
        System.out.println();
        for (int i = 30; i >=0 ; i-=2) {
            System.out.print(((n>>i)&1)+" ");
        }
    }

}

